﻿#define _CRT_SECURE_NO_WARNINGS 1
//联合体类型
#include<stdio.h>
//union u
//{
//	char c;
//	int i;
//};
//int main()
//{
//	union u u1 = {0};
//	printf("%zd", sizeof(u1));//4
//	return 0;
//}
//union un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	union un u = { 0 };
//	/*printf("%p\n", &u);
//	printf("%p\n", &(u.c));
//	printf("%p\n", &(u.i));*///三个地址一样
//	u.i = 0x11223344;
//	u.c = 0x55;
//	printf("%x", u.i);
//	return 0;
//}
//struct S
//{
//	char c;
//	int i;
//};
//union U
//{
//	char c;
//	int i;
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct S));//8
//	printf("%zd\n", sizeof(union U));//4
//	//结构体和联合体的内存布局不一样，联合体可以共用内存空间，可以节省空间。
//	return 0;
//}
//联合体的大小计算
//union U
//{
//	char c[10];//1 8 1   10不是最对齐数4的倍数，所以浪费两个空间，一共12个字节
//	int i;// 4 8 4  //联合的⼤⼩⾄少是最⼤成员的⼤⼩。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候，就要对⻬到最⼤对⻬数的整数倍。
//};
//union UN
//{
//	short c[5];//2 8 2    10不是4的倍数所以为12
//	int i;     //4 8 4
//};
//union Un
//{
//	double c[20]; //8 8 8  160是8的倍数
//	long long int i;//8 8 8
//};
//int main()
//{
//	printf("%zd\n", sizeof(union U));//12
//	printf("%zd\n", sizeof(union UN));//12
//	printf("%zd\n", sizeof(union Un));//160
//
//
//	return 0;
//}
/*使⽤联合体是可以节省空间的，举例：
⽐如，我们要搞⼀个活动，要上线⼀个礼品兑换单，礼品兑换单中有三种商品：图书、杯⼦、衬衫。
每⼀种商品都有：库存量、价格、商品类型和商品类型相关的其他信息。
图书：书名、作者、⻚数
杯⼦：设计
衬衫：设计、可选颜⾊、可选尺⼨*/
//struct gift_list
//{
//	//公共类型
//	int inventory;//库存量
//	int price;//价格
//	int product_type;//商品类型
//
//	//图书类型
//	char book_name[10];
//	char writer[20];
//	int  pages;
//	//杯子类型
//	char design[50];
//	//衬衫类型
//	char design[50];
//	char color[20];
//	char size[20];
//};//结构体有一些私有属性，其他的商品用不到，所以会造成大量的空间浪费。

//struct S
//{
//	//公共类型
//	int inventory;//库存量
//	int price;//价格
//	int product_type;//商品类型
//	union book
//	{
//		//图书类型
//		char book_name[10];
//		char writer[20];
//		int  pages;
//	};
//	union cup
//	{
//		//杯子类型
//		char design[50];
//	};
//	union shirt
//	{
//		//衬衫类型
//		char design[50];
//		char color[20];
//		char size[20];
//	};
//};//三个联合体共用一块空间，这样就不会造成大量的空间浪费。
//联合体练习
//int check()
//{
//	union u
//	{
//		char c;
//		int i;
//	};
//	union u x = { 0 };
//	x.i = 0x00000001; //大端 0x00000001  小端 0x10000000
//	return x.c;
//}
//int check()
//{
//	int i = 1;
//	return *(char*)&i;
//}
//union U
//{
//	int i;
//	struct S
//	{
//		char c1;
//		char c2;
//		char c3;
//		char c4;
//	}s;
//
//}u;
//int main()
//{
//	u.i = 0x00000001;
//	printf("%x %x %x %x", u.s.c1,u.s.c2,u.s.c3,u.s.c4);
//	/*int ret = check();
//	printf("%d\n", ret);
//	if (ret == 1)
//		printf("小端");
//	else
//		printf("大端");*/
//	return 0;
//}
//int main()
//{
//	printf("hehe");
//	return 0;
//}
//二.枚举类型
//enum Day
//{
//	//枚举常量
//	Mon,
//	Tues,
//	Wed,
//	Thur,
//	Fri,
//	Sat,
//	Sun
//};
//enum Sex
//{
//	MALE,
//	FEMALE,
//	SECRET
//};
//enum Game
//{
//	EXIT,
//	NIZHAN,
//	QQVERYCAR,
//	QQDANCE
//};
//void meau()
//{
//	printf("*********************************\n");
//	printf("*****        1.逆战        ******\n");
//	printf("*****        2.QQ飞车      ******\n");
//	printf("*****        3.QQ炫舞      ******\n");
//	printf("*****        0.退出游戏     ******\n");
//	printf("*********************************\n");
//}
//int main()
//{
//	int input = 0;
//	do
//		{
//		meau();
//		scanf("%d", &input);
//		switch (input)
//		{
//		case NIZHAN:
//			printf("开始逆战\n");
//			break;
//		case QQVERYCAR:
//			printf("开始QQ飞车\n");
//			break;
//		case QQDANCE:
//			printf("开始QQ炫舞\n");
//			break;
//		case EXIT:
//			printf("退出游戏\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}
//int main()
//{
//	enum Day date = Fri;
//	date = Sat;
//	printf("%d", date);
//	return 0;
//}
//加油啊！